import { getUserInfo, login, logout } from "@/api/auth/auth";
import { getToken, setToken, removeToken } from "@/utils/auth";

const state = {
	token: getToken(), // token (存储在本地浏览器的 Cookie 中)
	user: '', // 用户对象
};

const mutations = {
	SET_TOKEN_STATE: (state, token) => {
		state.token = token;
	},
	SET_USER_STATE: (state, user) => {
		state.user = user;
	},
};

const actions = {
	// 用户登录
	// login action
	login({ commit }, loginFormModel) {
		return new Promise((resolve, reject) => {
			login(loginFormModel).then(response => {
				const { data } = response;

				// 登录操作成功后，将响应回前端的 JWT 同时存储在 cookie (Disk) 与 store (Memory) 中:
				// 将 token 保存到 store 中 (关闭浏览器后，store 中的 token 立刻被销毁)
				commit('SET_TOKEN_STATE', data.token)
				// 将 token 保存到 cookie 中 (关闭浏览器后，cookie 中的 token 只有到了设置的失效时间才别销毁)
				setToken(data.token)

				resolve()
			}).catch(error => {
				reject(error)
			})
		})
  	},

	// 获取用户信息
	getUserInfo({ commit, state }) {
		return new Promise((resolve, reject) => {
			getUserInfo().then(response => {
				const { data } = response

				// 若没有从后端得到对应用户信息 
				if (!data) {
					commit('SET_TOKEN_STATE', '')
					commit('SET_USER_STATE', '')
					removeToken()
					resolve()
					reject('Verification failed, please Login again.')
				}
				
				// 若从后端得到了对应用户信息
				commit('SET_USER_STATE', data)
				resolve(data)
			}).catch((error) => {
				reject(error)
			})
		})
	},

	// 注销
	logout({ commit, state }) {
		return new Promise((resolve, reject) => {
			logout(state.token).then(response => {
				// 清空 store 中的 token 和 username
				commit('SET_TOKEN_STATE', '')
				commit('SET_USER_STATE', '')
				// 清空浏览器本地的 token
				removeToken()
				resolve()
			}).catch((error) => {
				reject(error)
			})
		})
	}
}

export default {
	namespaced: true,
	
	state,
	mutations,
	actions,
};
